/*
 * Pruebas unitarias para la clase StackVector utilizando strings como
 * tipos de datos a guardar.
 * 
 * Autor: Jorge Luis Martínez
 * Fecha: 15/jul/2012
 */
package Stack;

import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;

/**
 *
 * @author Jorge Luis Martínez
 */
public class StackVectorTest {
    
    private StackVector<String> datosPrueba;
    private String ultimoElemento = "Ultimo";
    private int tamañoPila = 4;
    
    public StackVectorTest() {
    }
    
    /**
     * Inicializa los datos que se estarán usando en las pruebas.
     */
    @Before
    public void setUp() {
        datosPrueba = new StackVector<>();
        datosPrueba.push("Primera");
        datosPrueba.push("Segunda");
        datosPrueba.push("Tercera");
        datosPrueba.push(ultimoElemento);
    }

    /**
     * Test of push method, of class StackVector.
     */
    @Test
    public void testPush() {
        // Agregar un nuevo elemento y verificar que sea diferente
        // al esperado que sea el último.
        String nuevo = "Nuevo";
        datosPrueba.push( nuevo );
        assertFalse( datosPrueba.peek().equals(ultimoElemento) );
    }

    /**
     * Test of pop method, of class StackVector.
     */
    @Test
    public void testPop() {
        // Se hace pop de un elemento y se espera que
        // este no se encuentre en la pila al hacer peek()
        String elementoPop = datosPrueba.pop();
        assertEquals( elementoPop, ultimoElemento );
    }

    /**
     * Test of peek method, of class StackVector.
     */
    @Test
    public void testPeek() {
        // Espera que al hacer peek dos veces se tenga el mismo elemento,
        // además que tiene que ser ultimoElemento.
        String peek1 = datosPrueba.peek();
        String peek2 = datosPrueba.peek();
        assertEquals( peek1, peek2 );
        assertEquals( peek1, ultimoElemento );
    }

    /**
     * Test of empty method, of class StackVector.
     */
    @Test
    public void testEmpty() {
        // Puesto que la pila tiene elementos se espera que salga
        // primero como no llena. Luego se vacía y debe marcar que está
        // vacía.
        assertFalse( datosPrueba.empty() );
        
        for( int i = 0; i != tamañoPila; ++i )
            datosPrueba.pop();
        
        assertTrue( datosPrueba.empty() );
    }

    /**
     * Test of size method, of class StackVector.
     */
    @Test
    public void testSize() {
        // El tamaño de la pila debe de ser el esperado. Debe crecer con
        // push y decrecer con pop
        assertEquals( tamañoPila, datosPrueba.size() );
        
        datosPrueba.push( "Elemento de prueba" );
        assertEquals( tamañoPila+1, datosPrueba.size() );
        datosPrueba.pop();
        assertEquals( tamañoPila, datosPrueba.size() );
    }
}
